package ricky.loader
{
	import flash.net.URLLoaderDataFormat;
	import flash.utils.Dictionary;
	
	import ricky.Interface.IDispose;
	import ricky.plutonium.Application;
	import ricky.utils.Utils;

	/**
	 * 加载资源的请求
	 */
	public class Request implements IDispose
	{
		/**
		 * 加载请求</br>
		 * 参数:</br>
		 * <b>url:*</b> 文件地址 可是二进制</br>
		 * <b>onComplete:Function(data:*,key:String)</b> 加载完成后的回调函数 参数为二个data加载的数据,key加载是用的key</br>
		 * key:文件名</br>
		 * <b>priority:int</b> 优先等级  值越大优先级越高
		 */
		public function Request(url:String,onComplete:Function=null,priority:int=0,key:String="",type:String="")
		{
			this.url=url;
			this.onComplete=onComplete;
			this.priority=priority;
			this.key=key;
			this.type=type;
		}


		public function dispose():void
		{
			this.url=null;
			this.onComplete=null;
			this.cache=null;
			this.priority=priority;
			this.key=null;
			this.type=null;
			_data=null;
			_head=null;
		}
		
		private var _data:*;
		
		private var _head:*;
		
		private var _key:String;
		
		private var _relative:String
		
		private var _domain:String="";
		
		/**
		 * 加载请求
		 */
		private var _url:String;
		
		private var _type:String;
		
		private var _cache:Dictionary;

		/**
		 * 文件后缀类型</br>
		 * 默认根据url后缀来生成</br>
		 * 如果设定以设定值为准.解码的时候是根据type来解码的.例如.jpg .swf 解码后成相应的对象类型
		 */
		public function get type():String
		{
			if(_type=="") 
				_type=Utils.getURLFileType(_url).toLocaleLowerCase();
			return _type;
		}

		/**
		 * @private
		 */
		public function set type(value:String):void
		{
			_type = value;
		}

		/**
		 * 加载的头信息
		 */
		public function get head():*
		{
			return _head;
		}

		/**
		 * @private
		 */
		public function set head(value:*):void
		{
			_head = value;
		}

		/**
		 * 加载的数据
		 */
		public function get data():*
		{
			return _data;
		}

		/**
		 * @private
		 */
		public function set data(value:*):void
		{
			_data = value;
		}

		/**
		 * 加载完成回调</br>
		 * <b>onComplete:Function(req:Request)</b> 
		 * 加载完成后的回调函数
		 * 参数为为当前请求</br>
		 */
		public var onComplete:Function;
		
		/**
		 * 重实n次加载失败后回调</br>
		 * <b>onError:Function(req:Request)</b> 
		 * 加载完成后的回调函数
		 * 参数为为当前请求</br>
		 */
		public var onEnd:Function;
		
		/**
		 * 请求地址 网址，相对路径，绝对路径
		 */
		public function get url():String
		{
			return _url;
		}

		/**
		 * @private
		 */
		public function set url(value:String):void
		{
			_url = value;
			if(_url.indexOf(":")>0)//如果有协议 http:// app:/  app-storage:/
			{
				var di:int=_url.indexOf("/");
				if(_url.toLocaleLowerCase().indexOf("http")==0)
				{
					di=_url.indexOf("/",di+1);
					di=_url.indexOf("/",di+1);
				}
				var http:String=_url.substring(0,di+1);
				var context:String=_url.substring(di+1,_url.length);
				context=context.split("?")[0];
				relative=context;
				_domain=http;
			}else
			{
				this.relative=_url.split("?")[0];
				
				if(Application.native)
					_url=Application.nativePath+_url;
			}
		}

		/**
		 *缓存用的关键字
		 * 如果没有设定 则为默认key生成规则
		 */
		public function get key():String
		{
			if(_key=="")
				_key=Utils.getURLFileName(url);
			return _key;
		}

		/**
		 * @private
		 */
		public function set key(value:String):void
		{
			_key = value;
		}

		
		/**
		 * 相对根目录路径
		 */
		public function get relative():String
		{
			return _relative;
		}
		
		/**
		 * @private
		 */
		public function set relative(value:String):void
		{
			_relative = value;
		}
		
		/**
		 * 当前请求的域名 在设置url属性的时候自动设置
		 */
		public function get domain():String
		{
			return _domain;
		}
		
		/**
		 * 缓存对应的字典类型
		 */
		public function get cache():Dictionary
		{
			return _cache;
		}

		/**
		 * @private
		 */
		public function set cache(value:Dictionary):void
		{
			_cache = value;
		}

		//回调
		/**
		 * 优先等级
		 * 降序</br>
		 *  <b>priority:int</b> 优先等级  值越大优先级越高
		 */
		public var priority:int=0;//优先级
		
		/**
		 * 加载次数
		 * 加载失败的时候记录
		 */
		public var times:int=0;
	}
}